#include "hal.h"
#include "cilindrica.h"
#include "relay.h"
#include "terminal.h"
#include "sensors.h"
#include "timers.h"
#include "inversor_frequencia.h"

volatile unsigned int 	Timer1ms[NUMTMR1MS];
volatile unsigned int 	Timer10ms[NUMTMR10MS];

Controle gControleCilindrica;
union_terminal	sTempTerminal;

typedef enum
{
	eInicio,
	eEspera1,
	eEspera2,
	eLigaAgua,
	eEspera3,
	eAvancoBracoTravarBloco,
	eRecuoBracoLiberarBloco,
    eIniciaProcessoSentido1,
    eMonitoraTempoOperacao1,
    eParadaProcessoSentido1,
    eIniciaProcessoSentido2,
    eMonitoraTempoOperacao2,
    eParadaProcessoSentido2,
    eFimProcesso,
    eParadaFimProcesso,
    eDesligaAgua,
        
}eTesteAvancoRecuoBraco;


/**********************************************************************************
 * void ProcessoCilindrica(void)
 * Descrição: Finalidade de realizar o controle de estados do processo do
 * modulo cilindrico/polidor
 *
 * Paramêtro(s):
 *					-
 * Retorno:
 *					-
 **********************************************************************************/

void ProcessoCilindrica(void){
	//variavel de estados para o processo
	static uint8_t lStateBraco	=	eInicio ;

	switch (lStateBraco) 
	{
		case eInicio:	//espera desarmar o braco, siginifca ir� ter atingido o sensor de fim de curso do recuo
			if((!sensores.input.s3)){
				//braco foi baixado
				lStateBraco	=	eEspera1;
			}else{
				if(gTerminal.input.ligado){
					if(!Tmr10msEntreTx){
						Tmr10msEntreTx = 2;
						terminal_reset();
					}
				}
			}
			break;
		case eEspera1:	//aguarda tecla de inicio
			if((gTerminal.input.ligado)){
				lStateBraco	=	eAvancoBracoTravarBloco;
			}
			if((sensores.input.s3)){
				//braço foi levantado
				lStateBraco	=	eInicio;
			}
			break;
		case eAvancoBracoTravarBloco:	//espera ligar
			if(gTerminal.input.ligado){
				//configura os parametros selecionados pressao,tempo,velocidade
				ConfiguraParametro();
				//realiza o avanco do braco com finalidade de travar o bloco
				AvancoBraco();
				//delay de 5s para incializar a configuraçao dos paramentros
				TimerSysTick.TimerEspera	=	5000;
				lStateBraco	=	eEspera2;
			}
			break;
		case eEspera2:
			if(!TimerSysTick.TimerEspera){
				lStateBraco	=	eLigaAgua;
				TimerSysTick.TimerEspera	=	3000;
			}
			break;
		case eLigaAgua:
			//liga bomba dagua e aguarda 3s
			relay_active(PORT_RELAYS,RELAY_AGUA);
			lStateBraco	=	eEspera3;
			TimerSysTick.TimerEspera	=	3000;
			break;
		case eEspera3:
			if(!TimerSysTick.TimerEspera){
				lStateBraco	=	eIniciaProcessoSentido1;
			}
			break;
		case eIniciaProcessoSentido1:
			inversor_sentido1();
			inversor_frequencia_on();
			//Habilita o contador de controle do tempo de operaçao com a metade do tempo a ser executado
			gControleCilindrica.TempoOperacao	=	gControleCilindrica.TempoSelecionado/2;
			gControleCilindrica.Ativo	=	1;
			lStateBraco	=	eMonitoraTempoOperacao1;
			break;
			
		case	eMonitoraTempoOperacao1:
			if(!gControleCilindrica.TempoOperacao)
			{	//Desabilita o tempo de processo do sentido 1
				gControleCilindrica.Ativo	=	0;
				inversor_frequencia_off();
				lStateBraco	=	eParadaProcessoSentido1;
				TimerSysTick.TimerEspera	=	5000;// irá esperar 5s para considerar o braco parado
			}
			else
			{
				//aqui verificar press�o no sensor. Se cair, aborta processo
			}
			break;
		case eParadaProcessoSentido1:
			//ira esperar terminar o fim do processo de parada do sentido para poder acionar o sentido 2
			if(!TimerSysTick.TimerEspera){
					lStateBraco	=	eIniciaProcessoSentido2;
			}
			break;
		case	eIniciaProcessoSentido2:
			inversor_sentido2();
			inversor_frequencia_on();
			//Habilita o contador de controle do tempo de operaçao com a metade do tempo a ser executado
			gControleCilindrica.TempoOperacao	=	gControleCilindrica.TempoSelecionado/2;
			gControleCilindrica.Ativo	=	1;
			lStateBraco	=	eMonitoraTempoOperacao2;
			break;
			
		case	eMonitoraTempoOperacao2:
			if(!gControleCilindrica.TempoOperacao)
			{
				gControleCilindrica.Ativo	=	0;
				inversor_frequencia_off();
				//delay de parada total antes de liberar o braco
				lStateBraco	=	eParadaProcessoSentido2;
			}
			break;
		case eParadaProcessoSentido2:
			//ira esperar terminar o fim do processo de parada do sentido para poder acionar o sentido 2
			if(!TimerSysTick.TimerEspera){
					lStateBraco	=	eFimProcesso;
			}
			break;
		case eFimProcesso:
			//garante o desligamento do inversor de frequencia
			//ja estimando que que estejas em processos que ja o ativaram
			inversor_frequencia_off();
			TimerSysTick.TimerEspera	=	5000;
			lStateBraco	=	eParadaFimProcesso;
			//envia o Reset para Terminar para sinalizar que o processo foi desligado ou finalizado
			terminal_reset();
			break;
		case eParadaFimProcesso:
			//ira esperar terminar o fim do processo de parada do inversor
			if(!TimerSysTick.TimerEspera){
					lStateBraco	=	eDesligaAgua;
			}
			break;
		case eDesligaAgua:
			//desliga a bomba dagua
			relay_deactive(PORT_RELAYS,RELAY_AGUA);
			//libera o braco para poder ser realizado o recuo
			RecuoBraco();
			lStateBraco	=	eInicio;
			break;
		default:
			lStateBraco	=	eInicio;
			break;
	}

	if((!gTerminal.input.ligado) && (lStateBraco	!=	eInicio)){//desligado o processo caso já tenha iniciado o mesmo
		lStateBraco	=	eFimProcesso;	//ira desligar todos os acinamento para finalizar o processo independente da situacao
	}
}
/**********************************************************************************
 * void ConfiguraParametro(void)
 * Descricao: Funcionalidade de garantir o carregamento dos paramentros selecionados
 * pelo terminal. Esses parametro deverao ser definidos antes de ligar/iniciar processo.
 * Caso os valores nao estejam definidos inicialmente serao definidos valores pressao,
 * velocidade e tempo todos ou individualmente pelo padrao '1'.
 *
 * Parametro(s):
 *					-
 * Retorno:
 *					-
 **********************************************************************************/
void ConfiguraParametro(void){
	//define a pressao selecionada no teclado
	if(gTerminal.input.pressao2){
		gControleCilindrica.PressaoOperacao		=	PRESSAO_2;
	}else if(gTerminal.input.pressao3){
		gControleCilindrica.PressaoOperacao		=	PRESSAO_3;
	}else {//gTerminal.input.pressao1
		gControleCilindrica.PressaoOperacao		=	PRESSAO_1;
	}

	if(gTerminal.input.tempo2){
		gControleCilindrica.TempoSelecionado		=	TEMPO_2;
	}else if(gTerminal.input.tempo3){
		gControleCilindrica.TempoSelecionado		=	TEMPO_3;
	}else {//gTerminal.input.tempo1
		gControleCilindrica.TempoSelecionado		=	TEMPO_1;
	}
	//tempo total de operacao
	gControleCilindrica.TempoOperacao     =	gControleCilindrica.TempoSelecionado;

	sTempTerminal.u16	=	gTerminal.u16;
}
